"""
实现一个可切片的类
需要是一个 sequence 类型的, 所以必须实现 sequence 需要的抽象方法
要实现切片, 最主要的是实现 __getitem__() 方法
"""

import numbers  # 这个主要用来判断是不是 int 类型


class Group(object):
    """支持切片的类"""

    def __init__(self, group_name, company_name, stuffs):
        self.group_name, self.company_name, self.stuffs = group_name, company_name, stuffs

    def __str__(self):
        """
        用于测试
        """
        return f"{self.group_name} -- {self.company_name} -- {self.stuffs}"

    def __getitem__(self, item):
        """

        :item: slice 类型或 int 类型
        :returns: TODO

        """
        cls = type(self)  # 获取当前实例的类
        if isinstance(item, slice):
            return cls(group_name=self.group_name,
                       company_name=self.company_name,
                       stuffs=self.stuffs[item]
                       )
        if isinstance(item, numbers.Integral):
            return cls(group_name=self.group_name,
                       company_name=self.company_name,
                       stuffs=[self.stuffs[item]]
                       )

    def __reversed__(self):
        """
        :returns: TODO

        """
        self.stuffs.reverse()

    def __len__(self):
        """
        :returns: TODO

        """
        return len(self.stuffs)

    def __iter__(self):
        """
        #  TODO <19-06-10, Codergege> # 这里的迭代器应该改成 Group 的
        :returns: TODO

        """
        return iter(self.stuffs)

    def __contains__(self, item):
        """

        :item: TODO
        :returns: TODO

        """
        if item in self.stuffs:
            return True
        else:
            return False


# 测试一下
stuffs = ["tom", "bob", "jack"]
group = Group("user", "future", stuffs)

# 写好 --getitem__ 后就能用了
sub_group = group[:2]
print(sub_group)
sub_group2 = group[0]
print(sub_group2)

# 写好 __len__ 后
print(f"长度是: {len(group)}")

# 写好 __iter__ 后
print(f"迭代输出 group:")
for g in group:
    print(f"\t{g}")

# 写好 __contains__ 后
print(f"tom 是否在 group 中: {'tom' in group}")
print(f"john 是否在 group 中: {'john' in group}")

# 写好 __reversed__ 后
reversed(group)
print(f"反转后的 group: {group}")
